// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraExperienceDefinition.h"
#include "GameFeatureAction.h"

#if WITH_EDITOR
#include "Misc/DataValidation.h"
#endif

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraExperienceDefinition)

#define LOCTEXT_NAMESPACE "LyraSystem"

/**
 * 构造函数
 */
ULyraExperienceDefinition::ULyraExperienceDefinition()
{
}

#if WITH_EDITOR
/**
 * 数据验证
 * @param Context 数据验证上下文
 * @return 数据验证结果
 */
EDataValidationResult ULyraExperienceDefinition::IsDataValid(FDataValidationContext& Context) const
{
	EDataValidationResult Result = CombineDataValidationResults(Super::IsDataValid(Context), EDataValidationResult::Valid); // 组合数据验证结果

	int32 EntryIndex = 0; // 条目索引
	// 遍历所有操作
	for (const UGameFeatureAction* Action : Actions)
	{
		// 如果操作有效
		if (Action)
		{
			EDataValidationResult ChildResult = Action->IsDataValid(Context); // 子结果验证
			Result = CombineDataValidationResults(Result, ChildResult); // 组合结果
		}
		else
		{
			Result = EDataValidationResult::Invalid; // 结果无效
			Context.AddError(FText::Format(LOCTEXT("ActionEntryIsNull", "Actions中的索引{0}处有空条目"), FText::AsNumber(EntryIndex))); // 添加错误
		}

		++EntryIndex; // 递增索引
	}

	// 确保用户没有从此类的蓝图子类化（在蓝图中子类化一次是可以的，但不要两次）
	if (!GetClass()->IsNative()) // 如果不是原生类
	{
		const UClass* ParentClass = GetClass()->GetSuperClass(); // 获取父类

		// 查找原生父类
		const UClass* FirstNativeParent = ParentClass; // 第一个原生父类
		while ((FirstNativeParent != nullptr) && !FirstNativeParent->IsNative()) // 循环直到找到原生父类
		{
			FirstNativeParent = FirstNativeParent->GetSuperClass(); // 获取父类
		}

		// 如果第一个原生父类不等于直接父类
		if (FirstNativeParent != ParentClass)
		{
			Context.AddError(FText::Format(LOCTEXT("ExperienceInheritenceIsUnsupported", "不支持蓝图的蓝图子类（请改用通过ActionSets的组合）。父类是{0}但应该是{1}。"), 
				FText::AsCultureInvariant(GetPathNameSafe(ParentClass)), // 父类路径
				FText::AsCultureInvariant(GetPathNameSafe(FirstNativeParent)) // 第一个原生父类路径
			));
			Result = EDataValidationResult::Invalid; // 结果无效
		}
	}

	return Result; // 返回结果
}
#endif

#if WITH_EDITORONLY_DATA
/**
 * 更新资源包数据
 */
void ULyraExperienceDefinition::UpdateAssetBundleData()
{
	Super::UpdateAssetBundleData(); // 调用父类实现

	// 为每个操作添加额外的资源包数据
	for (UGameFeatureAction* Action : Actions)
	{
		if (Action)
		{
			Action->AddAdditionalAssetBundleData(AssetBundleData); // 添加额外资源包数据
		}
	}
}
#endif // WITH_EDITORONLY_DATA

#undef LOCTEXT_NAMESPACE